package Util;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipException;
import java.util.zip.ZipFile;

/**
 *
 * @author Gláucio
 */
public class Zip {

  public static void main(String args[]) throws IOException {
    //unzip(new File("c:\\Posts.zip"), new File("c:\\"));
  }

  public int unzip(File zipFile, File dir) throws IOException {
    ZipFile zip = null;
    File arquivo = null;
    InputStream is = null;
    OutputStream os = null;
    byte[] buffer = new byte[1024];
    int cont = 0;

    try {
      // cria diretório informado, caso não exista
      if (!dir.exists()) {
        dir.mkdirs();
      }
      if (!dir.exists() || !dir.isDirectory()) {
        throw new IOException("O diretório " + dir.getName() + " não é um diretório válido");
      }

      zip = new ZipFile(zipFile);
      Enumeration e = zip.entries();
      while (e.hasMoreElements()) {
        cont++;
        ZipEntry entrada = (ZipEntry) e.nextElement();
        arquivo = new File(dir, entrada.getName());

        // se for diretório inexistente, cria a estrutura e pula pra próxima entrada
        if (entrada.isDirectory() && !arquivo.exists()) {
          arquivo.mkdirs();
          continue;
        }

        // se a estrutura de diretórios não existe, cria
        if (!arquivo.getParentFile().exists()) {
          arquivo.getParentFile().mkdirs();
        }
        try {
          // lê o arquivo do zip e grava em disco
          is = zip.getInputStream(entrada);
          os = new FileOutputStream(arquivo);
          int bytesLidos = 0;
          if (is == null) {
            throw new ZipException("Erro ao ler a entrada do zip: " + entrada.getName());
          }
          while ((bytesLidos = is.read(buffer)) > 0) {
            os.write(buffer, 0, bytesLidos);
          }
        } finally {
          if (is != null) {
            try {
              is.close();
            } catch (Exception ex) {
            }
          }
          if (os != null) {
            try {
              os.close();
            } catch (Exception ex) {
            }
          }
        }
      }
    } finally {
      if (zip != null) {
        try {
          zip.close();
        } catch (Exception e) {
        }
      }
    }
    return cont;
  }

  public ArrayList unzip(File zipFile) throws IOException {
    byte[] buffer = new byte[2048];
    ArrayList arquivos = new ArrayList();

    ZipFile zip = new ZipFile(zipFile);
    Enumeration e = zip.entries();
    while (e.hasMoreElements()) {
      ZipEntry entrada = (ZipEntry) e.nextElement();
      if (! entrada.getName().contains(".txt")) continue;
      InputStream is = zip.getInputStream(entrada);

      int bytesLidos = 0;
      if (is == null) {
        throw new ZipException("Erro ao ler a entrada do zip: " + entrada.getName());
      }

      String texto = "";
      while ((bytesLidos = is.read(buffer)) > 0) {
        String s = new String(buffer);
        s = s.substring(0, bytesLidos);
        texto += s;
      }
      if (texto.length() > 0) {
        arquivos.add(texto.trim().replace("\n", "").replace("\r", ""));
      }
    }

    return arquivos;
  }
}
